﻿using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using DesktopDOHS.appData.Schemas;

namespace PocketDOHS
{
    static class Dados
    {
        private static MensagemDOHS mensagem = new MensagemDOHS();
        private static MensagemDOHSExamesDOHS exame = new MensagemDOHSExamesDOHS();
        private static MensagemDOHSExamesDOHSLoteGuias loteGuias = new MensagemDOHSExamesDOHSLoteGuias();
        private static List<MensagemDOHSExamesDOHSLoteGuiasGuia> guias = new List<MensagemDOHSExamesDOHSLoteGuiasGuia>();
        private static string MsgPath;

        #region Fields

        private static ct_Cabecalho cabecalho = new ct_Cabecalho();

        private static MensagemDOHSExamesDOHSLoteGuiasGuia guia = new MensagemDOHSExamesDOHSLoteGuiasGuia();

        #endregion

        #region Properties


        /// <summary>
        /// cabecalho da mensagem
        /// </summary>
        public static ct_Cabecalho Cabecalho
        {
            get { return Dados.cabecalho; }
            set { Dados.cabecalho = value; }
        }

        /// <summary>
        /// guia a ser adicionada na mensagem
        /// </summary>
        public static MensagemDOHSExamesDOHSLoteGuiasGuia Guia
        {
            get { return Dados.guia; }
            set { Dados.guia = value; }
        }

        #endregion

        #region Methods

        /// <summary>
        /// adiciona guia no lote e limpa a guia
        /// </summary>
        public static void addGuia()
        {
            guias.Add(guia);
        }

        /// <summary>
        /// Serializa Log da Mensagem
        /// </summary>
        public static void serializaLog()
        {
            TextReader tr = new StreamReader(@"..\Mensagens\MsgDOHSLog.oms");
            XmlSerializer xs = new XmlSerializer(typeof(MensagemDOHS));
            MensagemDOHS msgDOHSLog = (MensagemDOHS)xs.Deserialize(tr);
            tr.Close();
            MensagemDOHSExamesDOHS msgExameLog = new MensagemDOHSExamesDOHS();
            //Cabeçalho
            msgExameLog.Cabecalho = new ct_Cabecalho();
            msgExameLog.Cabecalho = Cabecalho;
            //Path
            MensagemDOHSExamesDOHSMsgLog log = new MensagemDOHSExamesDOHSMsgLog();
            MsgPath = DateTime.Now.ToString("dd_MM_yy_hh_mm_ss") + "MsgDOHS" + 
                cabecalho.CodExaminador + "_" + 
                Convert.ToDateTime(cabecalho.DataLevantamento).ToString("dd_MM_yyyy") + "_" +
                cabecalho.LocGeo + "_" + 
                cabecalho.TipoLoc + "_" + ".oms";
            log.Path = MsgPath;
            msgExameLog.Item = log;
            if (msgDOHSLog.ExamesDOHS != null)
            {
                int indice = msgDOHSLog.ExamesDOHS.Count();
                MensagemDOHSExamesDOHS[] logExames = new MensagemDOHSExamesDOHS[indice + 1];
                for (int i = 0; i < indice; i++)
                    logExames[i] = msgDOHSLog.ExamesDOHS[i];
                logExames[indice] = msgExameLog;
                msgDOHSLog.ExamesDOHS = logExames;
            }
            else
            {
                msgDOHSLog.ExamesDOHS = new MensagemDOHSExamesDOHS[1];
                msgDOHSLog.ExamesDOHS[0] = new MensagemDOHSExamesDOHS();
                msgDOHSLog.ExamesDOHS[0] = msgExameLog;
            }
            TextWriter tw = new StreamWriter(@"..\Mensagens\MsgDOHSLog.oms");
            xs.Serialize(tw, msgDOHSLog);
            tw.Close();
        }
    

        /// <summary>
        /// fecha a mensagem e limpa o cabeçalho, loteGuias e exame
        /// </summary>
        public static void fechaMensagem()
        {
            exame.Cabecalho = cabecalho;
            loteGuias.Guia = guias.ToArray();
            exame.Item = loteGuias;
            mensagem.ExamesDOHS = new MensagemDOHSExamesDOHS[1];
            mensagem.ExamesDOHS[0] = exame;
            guias.Clear();
            loteGuias = new MensagemDOHSExamesDOHSLoteGuias();
            cabecalho = new ct_Cabecalho();
        }

        /// <summary>
        /// Serializa Mensagem DOHS
        /// </summary>
        public static void serializaMensagem()
        {
            MsgPath = "";
            Dados.serializaLog();
            Dados.fechaMensagem();
            XmlSerializer xs = new XmlSerializer(typeof(MensagemDOHS));
            TextWriter tw = new StreamWriter(@"..\Mensagens\" + MsgPath);
            xs.Serialize(tw, mensagem);
            tw.Close();
        }
        
        /// <summary>
        /// Contador de guias no Lote
        /// </summary>
        /// <returns>Quantidade de Guias no Lote</returns>
        public static int GuiasCount()
        {
            return guias.Count;
        }

        /// <summary>
        /// inicia uma Guia para inserção de Dados
        /// </summary>
        public static void iniciaGuia()
        {
            guia = new MensagemDOHSExamesDOHSLoteGuiasGuia();
            //Informações Gerais
            guia.InfoGeral = new ct_InfoGeral();
            guia.InfoGeral.DataNasc = new ct_InfoGeralDataNasc();

            //Avaliação Clínica
            guia.AvaliacaoClinica = new MensagemDOHSExamesDOHSLoteGuiasGuiaAvaliacaoClinica();

            //Exame Extra-Bucal
            //guia.AvaliacaoClinica.ExameExtraBucal = "";
            
            //Avaliação da Articulação Temporo-Mandibular
            guia.AvaliacaoClinica.AvalArtTemporo = new ct_AvalArtTemporo();
            guia.AvaliacaoClinica.AvalArtTemporo.Sintomas = new ct_AvalArtTemporoSintomas();

            //Mucosa Bucal
            guia.AvaliacaoClinica.MucosaBucal = new ct_MucosaBucal();
            guia.AvaliacaoClinica.MucosaBucal.Cond1 = new ct_Condicao();
            guia.AvaliacaoClinica.MucosaBucal.Cond2 = new ct_Condicao();
            guia.AvaliacaoClinica.MucosaBucal.Cond3 = new ct_Condicao();

            //Opacidade Esmalte/Hipoplasia
            guia.AvaliacaoClinica.OpacidadeHipoplasia = new ct_OpacidadeHipoplasia();

            //Fluorose Dentária
            //guia.AvaliacaoClinica.FluoroseDentaria = "";

            //Indice Periodontal Comunitário
            guia.AvaliacaoClinica.IPC = new ct_Periodontal();

            //Perda Inserção
            guia.AvaliacaoClinica.PerdaInsercao = new ct_Periodontal();

            //Condições Dentárias
            guia.AvaliacaoClinica.CondDent = new ct_CondDent();
            //Coroa
            guia.AvaliacaoClinica.CondDent.Coroa = new ct_Coroa();
            //Raiz
            guia.AvaliacaoClinica.CondDent.Raiz = new ct_Raiz();
            //Tratamento
            guia.AvaliacaoClinica.CondDent.Tratamento = new ct_Tratamento();
            guia.AvaliacaoClinica.CondDent.Tratamento.d18 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d17 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d16 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d15_55 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d14_54 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d13_53 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d12_52 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d11_51 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d21_61 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d22_62 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d23_63 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d24_64 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d25_65 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d26 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d27 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d28 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d38 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d37 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d36 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d35_75 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d34_74 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d33_73 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d32_72 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d31_71 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d41_81 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d42_82 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d43_83 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d44_84 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d45_85 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d46 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d47 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d48 = new ct_Trat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d18.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d17.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d16.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d15_55.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d14_54.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d13_53.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d12_52.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d11_51.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d21_61.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d22_62.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d23_63.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d24_64.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d25_65.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d26.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d27.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d28.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d38.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d37.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d36.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d35_75.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d34_74.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d33_73.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d32_72.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d31_71.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d41_81.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d42_82.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d43_83.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d44_84.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d45_85.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d46.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d47.Trat = new ct_TratTrat();
            guia.AvaliacaoClinica.CondDent.Tratamento.d48.Trat = new ct_TratTrat();

            //Condições Protéticas
            guia.AvaliacaoClinica.CondProt = new ct_CondProt();

            //Necessidade de Prótese
            guia.AvaliacaoClinica.NecProt = new ct_NecProt();

            //Anormalidades DentoFaciais
            guia.AvaliacaoClinica.AnomaliaDent = new ct_AnomDent();
            guia.AvaliacaoClinica.AnomaliaDent.Espaco = new ct_Espaco();
            guia.AvaliacaoClinica.AnomaliaDent.Oclusao = new ct_Oclusao();

            //Necessidade de Cuidados Imediatos
            guia.AvaliacaoClinica.NecCuidado = new ct_NecCuidado();
            guia.AvaliacaoClinica.NecCuidado.OutraCond = new ct_NecCuidadoOutraCond();
        }

        /// <summary>
        /// Inicia Cabeçalho para inserção de Dados
        /// </summary>
        public static void iniciaCabecalho()
        {
            cabecalho = new ct_Cabecalho();
        }

        /// <summary>
        /// busca Exame do Paciente
        /// </summary>
        /// <param name="ID">Identificação do Paciente</param>
        public static void buscaExame(string ID)
        {
            foreach (MensagemDOHSExamesDOHSLoteGuiasGuia g in guias)
            {
                if (g.InfoGeral.ID == ID)
                {
                    iniciaGuia();
                    guia = g;
                    guias.Remove(guia);
                    break;
                }
            }
        }

        #endregion

    }
}
